package org.example.creational.singleton.lazy;

public class LazySingleton {
    //多个线程可以共享内存的最新状态，即内存缓存一致性
    private volatile static LazySingleton lazySingleton = null;
    private LazySingleton(){

    }
//    public static LazySingleton getInstance(){
//        if (lazySingleton == null) {
//            lazySingleton = new LazySingleton();
//        }
//        return lazySingleton;
//    }

    /**
     * 线程锁方法，锁静态方法相当于锁对象，性能比较低
     */
//    public synchronized static LazySingleton getInstance(){
//        if (lazySingleton == null) {
//            lazySingleton = new LazySingleton();
//        }
//        return lazySingleton;
//    }

    /**
     * 等同与上述方法
     */
//    public static LazySingleton getInstance(){
//        synchronized (LazySingleton.class) {
//            if (lazySingleton == null) {
//                lazySingleton = new LazySingleton();
//            }
//        }
//        return lazySingleton;
//    }

    /**
     * doubulecheck（双重检查）方式
     */
    public static LazySingleton getInstance(){
        if (lazySingleton == null) {
            synchronized (LazySingleton.class) {
                if (lazySingleton == null) {
                    lazySingleton = new LazySingleton();
                    //new 经历三个步骤
                    //1.分配内存
                    //2.初始化对象
                    //3.设置lazySingleton指向分配的内存地址
                    /**2与3顺序可能颠倒，重排序，顺序变为：1-3-2，导致thread1完成了1-3步时候，
                     * 此时线程2的lazySingleton为非空，导致最后两个线程初始化出来两个对象
                     */
                }
            }
        }
        return lazySingleton;
    }


}
